import { Component, OnInit, ErrorHandler, Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
  handleError(error: any): void {
    console.error('全局错误处理器捕获到错误:', error);
    
    // 记录错误详情
    if (error.message) {
      console.error('错误消息:', error.message);
    }
    
    if (error.stack) {
      console.error('错误堆栈:', error.stack);
    }
    
    if (error.rejection) {
      console.error('Promise拒绝错误:', error.rejection);
    }
    
    // 处理Angular表单相关错误
    if (error && error.ngOriginalError) {
      console.error('Angular原始错误:', error.ngOriginalError);
    }
    
    // 忽略某些非关键性错误
    if (error && (
      (error.message && error.message.includes('ExpressionChangedAfterItHasBeenCheckedError')) ||
      (error.message && error.message.includes('formGroup')) ||
      (typeof error === 'string' && error.includes('formControlName'))
    )) {
      // 这些是常见的表单相关错误，通常在组件销毁后访问表单控件时发生
      // 我们可以选择不处理这些错误或者在控制台打印但不抛出
      console.warn('表单相关非关键错误，已被拦截:', error);
      return;
    }
  }
}

@Component({
  standalone: false,
  selector: 'app-root',
  template: `
    <abp-loader-bar></abp-loader-bar>
    <abp-dynamic-layout></abp-dynamic-layout>
    <abp-internet-status></abp-internet-status>
  `,
  providers: [
    { provide: ErrorHandler, useClass: GlobalErrorHandler }
  ]
})
export class AppComponent implements OnInit {
  constructor(
    private router: Router
  ) {}

  ngOnInit() {
    // 添加路由事件监听，记录路由变化
    this.router.events
      .pipe(filter(event => event instanceof NavigationEnd))
      .subscribe((event: NavigationEnd) => {
        console.log('路由导航完成:', event.url);
      });
      
    // 记录初始化完成
    console.log('应用初始化完成');
  }
}
